package com.whsxt.code;

/**
 * @author CodeYang
 * @Description switch 详解:
 * @Date 2020/12/5 15:21
 */
public class SwitchTest01 {


    /**
     * switch 支持的类型
     * <p>
     * 基本数据类型：int，byte，short，char
     * 基本数据类型封装类：Integer，Byte，Short，Character
     * 枚举类型：Enum（JDK 5+开始支持）
     * 字符串类型：String（JDK 7+ 开始支持）
     * case 的类型 必须与 switch(表达式)类型的变量一致,而且,必须是常量(固定量,或者final修饰的常量)
     * <p>
     * 实现原理:
     * switch底层是使用int类型来判断的，int类型是四个字节的整数型类型，
     * 所以只要字节小于或等于4的整数型类型都是可以转化成int类型的，所以支持byte[1字节]，
     * short[2字节]都是可以理解的，long[8字节]超出了int的范围，因而不支持。关于枚举和字符(串)也是转化为int类型间接实现的
     *
     * @param args
     */
    public static void main(String[] args) {
        Color color = Color.YELLOW;

        switch (color) {
            case RED:
                System.out.println("RED:" + color.getName());
                break;
            case YELLOW:
                System.out.println("GREEN:" + color.getName());
                break;
            case BLUE:
                System.out.println("BLUE:" + color.getName());
                break;
            case BLANK:
                System.out.println("BLANK:" + color.getName());
                break;
            default:
                System.out.println("DEFAULT");
                break;
        }
    }

    public enum Color {

        RED("红色", 1),
        YELLOW("绿色", 2),
        BLUE("蓝色", 3),
        BLANK("黑色", 4);

        private String name;
        private int index;

        private Color(String name, int index) {
            this.name = name;
            this.index = index;
        }

        public static String getName(int index) {
            for (Color c : Color.values()) {
                if (c.getIndex() == index) {
                    return c.name;
                }
            }
            return null;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getIndex() {
            return index;
        }

        public void setIndex(int index) {
            this.index = index;
        }

    }

}
